//
//  JSTemp.m
//  JSCDemo
//
//  Created by QHIEX on 16/4/22.
//  Copyright © 2016年 QHIEX. All rights reserved.
//

#import "JSTemp.h"

#import "JSTempProtocol.h"

#import "GlobalDefines.h"

#warning 1.JSValue只能看做是存在JSContext中的一个值，不能看做是该指针。
#warning 2.JSExport,如果一个类实现了JSExport，JSExport中所有的属性和方法都可以用于JSContext中协议继承可以排除很多不需要的属性和方法
#warning 3.Protocol中用@optional修饰的方法有可能找不到，用@required修饰或者默认的的方法能够找到
#warning 4.Protocol中的方法可以在任意类中实现，只要将相应的类注册给JSContext中的一个JSValue即可。例：context[@"temp"] = self
#warning 5.JS传值给Native：native创建方法，js端使用类对应的对象执行Protocol方法,传入相应参数即可。例：temp.getJson(jsData)
#warning 6.Native传值给JS:

@interface JSTemp()<JSTempProtocol>

/** JS传到native端的Json数据 */
@property (nonatomic, strong) NSDictionary *jsDict;

@end

@implementation JSTemp
- (id)init
{
    self = [super init];
    if (self) {
//        [self mainMehtod];
        
    }
    return self;
}


- (void)mainMehtod
{
    //创建JSContext
    _context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];
    //定义一个JSValue ，aNumber可以看做 （JS的一个数）
    _context[@"aNumber"] = @12;
    //打印aNumber值
    NSLog(@" aNumber = %d",[_context[@"aNumber"] toInt32]);
    
    //定义一个JSValue ，anotherNumber （JS的一个数）
    [_context evaluateScript:@"var anotherNumber = aNumber + 20"];
    //打印anotherNumber
    NSLog(@" anotherNumber = %d ",[_context[@"anotherNumber"] toInt32]);
    
    //定义一个JSValue ， console （JS的一个控制台对象）
    [_context evaluateScript:@"var console = {}"];
    //当JS调用 console的log方法时 执行block
    _context[@"console"][@"log"] = ^(NSString *message){
        NSLog(@" message = %@ ",message);
    };
    //当JS调用console.log输出某个东西的时候,例如：anotherNumber
    [_context evaluateScript:@"console.log(anotherNumber)"];
    //定义一个JSValue ，add （JS函数）
    [_context evaluateScript:@"var add = function(a,b){return a+b;}"];
    //函数 add 的调用 ，输入参数 20 30
    NSLog(@" 20 + 30 = %@ ",[_context[@"add"] callWithArguments:@[@20,@30]]);
    //函数 add 的调用 ，输入参数 aNumber ，anotherNumber
    NSLog(@" aNumber + anotherNumber = %@ ",[_context[@"add"] callWithArguments:@[_context[@"aNumber"],_context[@"anotherNumber"]]]);
    
    //定义一个JSValuer， addAndPrint （JS函数）
    [_context evaluateScript:@"var addAndPrint = function(a,b){console.log(add(a,b));}"];
    [_context[@"addAndPrint"] callWithArguments:@[@20,@30]];
    [_context[@"addAndPrint"] callWithArguments:@[_context[@"aNumber"],_context[@"anotherNumber"]]];
    
}

- (void)testJSExportMethod
{
    NSLog(@" %s ",__FUNCTION__);
}

- (void)JSsummation:(NSString *)message{
    NSLog(@"%@",message);
    if ([self respondsToSelector:@selector(JSsummation:)]) {
        
    }
//TODO:js返回结果转OC对象---------------------------------
    //js调用完OC后OC调用JS中的数据
    JSValue *value = _context[@"jsFunction"];
    [value callWithArguments:nil];
    
}

- (void)getJson:(NSString *)string
{
    LogBlue(@" string  = %@ ",string);
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
    if (error) {
        return;
    }
    self.jsDict = dic;
    LogBlue(@"%@",self.jsDict);
}



@end
